package com.es.util.file;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 文件操作工具类
 *
 * @author Will
 */
public class FileUtil {

    /**
     * 切换文件名称，主要路径分割符
     *
     * @param fileName
     * @return
     */
    public static String replaceName(String fileName) {
        return fileName.replace('/', File.separatorChar).replace('\\', File.separatorChar);
    }

    /**
     * 获取文件数据
     *
     * @param path
     * @return
     */
    public static byte[] getFileData(String path) {

        try (InputStream ins = new FileInputStream(path);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            int bufferSize = 4096;
            byte[] buffer = new byte[bufferSize];
            int bytesNumRead;
            while ((bytesNumRead = ins.read(buffer)) != -1) {
                baos.write(buffer, 0, bytesNumRead);
            }
            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 递归查找 java文件，获取文件具体路径
     *
     * @param path
     * @return
     */
    public static List<String> getFileList4Java(String path) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.addAll(getFileModified4Java(path).keySet());
        return arrayList;
    }

    /**
     * 递归查找文件，获取文件具体路径
     *
     * @param path
     * @return
     */
    public static List<String> getFileList(String path) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.addAll(getFileModified(path, null).keySet());
        return arrayList;
    }

    /**
     * 递归查找文件，获取文件具体路径
     *
     * @param path
     * @param type
     * @return
     */
    public static List<String> getFileList(String path, String type) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.addAll(getFileModified(path, type).keySet());
        return arrayList;
    }

    /**
     * 递归查找 java文件，获取文件路径以及最后修改时间
     *
     * @param path
     * @return
     */
    public static HashMap<String, Long> getFileModified4Java(String path) {
        return getFileModified(path, "java");
    }

    /**
     * 递归查找文件，获取文件路径以及最后修改时间
     *
     * @param path
     * @param fileType 文件格式
     * @return
     */
    public static HashMap<String, Long> getFileModified(String path, String fileType) {

        HashMap<String, Long> map = new HashMap<>();
        File file = new File(path);
        if (file.exists()) {
            if (file.isFile()) {
                map.put(file.getAbsolutePath(), file.lastModified());
            } else {
                File[] files = file.listFiles();
                if (null != files && files.length != 0) {
                    for (File fileNext : files) {
                        if (fileNext.isDirectory()) {
                            map.putAll(getFileModified(fileNext.getAbsolutePath(), fileType));
                        } else {
                            if (fileType == null || fileType.equals("")) {
                                map.put(fileNext.getAbsolutePath(), fileNext.lastModified());
                            } else {
                                String absolutePath = fileNext.getAbsolutePath();
                                String substring = absolutePath.substring(absolutePath.lastIndexOf(".") + 1);
                                if (substring.equals(fileType)) {
                                    map.put(absolutePath, fileNext.lastModified());
                                }
                            }
                        }
                    }
                }
            }
        }
        return map;
    }
}
